import pandas as pd
import geopandas as gpd
# from jupyterthemes import jtplot
import matplotlib.pyplot as plt
import plotly.express as px
import plotly.io as pio
import basedosdados as bd
import sqlite3 as sqlite
pio.renderers.default='notebook'
dbpath = 'cities.db'
# Create connection and load spatialite extension
con = sqlite.connect(dbpath)
con.enable_load_extension(True)
con.execute('SELECT load_extension("mod_spatialite")')
# SQL must wrap the geometry in hex(st_asbinary(...))
sql = "SELECT id, sigla_uf, name, Hex(ST_AsBinary(geometry)) as geom FROM cities;"
df = gpd.GeoDataFrame.from_postgis(sql, con, geom_col="geom")
Passaremos ao segundo indicador, buscando determinar se há alguma correlação entre este fator e a mortalidade por Covid-19 nos municípios do Rio de Janeiro. Para isso, utilizamos o ADH, Atlas do Desenvolvimento Humano, criado pela ONU, e que tem dentre suas informações a expectativa de vida. O banco de dados utilizado para esta parte também pertence à Base dos Dados, e os obtemos a seguir, utilizando o censo do IBGE mais recente, de 2010:
life_exp = bd.read_sql(
'''
SELECT id_municipio AS id, expectativa_vida
FROM basedosdados.mundo_onu_adh.municipio
WHERE ano = 2010
''',
billing_project_id='adameplayground')
Para isso, fazemos o merge a partir do id com o dataframe espacial, mantendo apenas os do estado do RJ, e fazendo as conversões necessárias.
cities_health = pd.merge(df, life_exp, how='inner', on='id')
rj_health = cities_health[cities_health['sigla_uf'] == 'RJ']
rj_health['id'] = rj_health['id'].astype(int)
rj_health.head()
Agora podemos fazer o gráfico do estado novamente, analisando a expectativa de vida para cada município. Note que esse índice se parece mais com o que havíamos visto do IDH do que o de educação, o que pode nos indicar uma queda na correlação entre os fatores.
fig = px.choropleth(rj_health,
geojson = rj_health["geom"],
locations = rj_health.index,
color = "expectativa_vida",
hover_name = "name",
hover_data = ["expectativa_vida"],
labels = {
"expectativa_vida": "Expectativa de vida"
},
color_continuous_scale = "Burg",
#animation_frame = 'date',
)
fig.update_geos(
projection=dict(
scale=55
),
center = dict(
lat=-22.208333,
lon=-42.896388
)
)
fig.update_layout(
title_text = "ADH de 2010, por município do RJ",
margin={"r":0,"t":50,"l":0,"b":50}
)
fig.show()
Ainda assim, realizaremos o mesmo processo anterior a partir dos dados de covid e da expectativa de vida.
covid = pd.read_csv('caso_full.csv.gz', compression='gzip')
filt = (covid['state'] == 'RJ') & (covid['place_type'] == 'city') & (covid['is_last'])
uniq = covid[filt]['city'].isin(rj_health['name'])
rj_covid = covid[filt][uniq]
rj_covid['id'] = rj_covid['city_ibge_code'].astype(int)
rj_covid = rj_covid.copy()[['id', 'estimated_population', 'last_available_confirmed_per_100k_inhabitants', 'last_available_death_rate']]
health_covid_rj = pd.merge(rj_health, rj_covid, how='inner', on='id')
health_covid_rj.head()
Certamente é necessário confirmar a desconfiança que temos de que a correlação será baixa, então faremos a análise a seguir:
fig = px.scatter(health_covid_rj, x="last_available_death_rate", y="expectativa_vida", hover_data=['name'], trendline="ols",
color_discrete_sequence=['#FF84DD'],trendline_color_override="orange",
title="Gráfico de dispersão entre taxa de mortalidade e ADH",
labels={"last_available_death_rate": "Taxa de mortalidade",
"name": "Município",
"expectativa_vida":"Expectativa de vida"})
fig.show()
Observe que, de fato, os pontos não apresentaram qualquer linearidade ou mesmo indicação de tendência, espalhando-se de forma apararentemente desordenada. A linha de tendência traçada tem o $R^2$ baixíssimo, e mesmo visualmente não parece ser acompanhada pelos pontos do gráfico. Assim, constatamos que o segundo indicador não tem correlação clara com a taxa de mortes por Covid-19 no estado, e passamos ao último indicador para podermos responder à pergunta original.
!jupyter nbconvert health_analysis.ipynb --to html --template classic